{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "29713ce9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer\n",
    "\n",
    "tokenizer = AutoTokenizer.from_pretrained('google/gemma-3-27b-it')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b62f374c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from streaming import MDSWriter\n",
    "from streaming.base.format.mds.encodings import Encoding, _encodings\n",
    "from streaming import LocalDataset\n",
    "import streaming\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "from glob import glob\n",
    "import os\n",
    "import json\n",
    "\n",
    "class UInt32(Encoding):\n",
    "    def encode(self, obj) -> bytes:\n",
    "        return obj.tobytes()\n",
    "\n",
    "    def decode(self, data: bytes):\n",
    "        return np.frombuffer(data, np.uint32)\n",
    "\n",
    "_encodings['uint32'] = UInt32\n",
    "\n",
    "columns = {\n",
    "    'input_ids': 'uint32',\n",
    "    'position_ids': 'uint32',\n",
    "    'attention_mask': 'uint32',\n",
    "}\n",
    "hashes = 'sha1', 'xxh64'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2daee173",
   "metadata": {},
   "outputs": [],
   "source": [
    "!rm -rf tokenized-8k\n",
    "!mkdir tokenized-8k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6e88c119",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !wget https://huggingface.co/datasets/mesolitica/Malaysian-SFT/resolve/main/combine/combined-malaysian-sft.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aad417e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !wget https://huggingface.co/datasets/mesolitica/Malaysian-SFT/resolve/main/extra/translation-instructions.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3047e27f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1294946"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "combine = []\n",
    "with open('combined-malaysian-sft.jsonl') as fopen:\n",
    "    for l in fopen:\n",
    "        l = json.loads(l)\n",
    "        combine.append(l)\n",
    "\n",
    "len(combine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2f212326",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1364946"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open('translation-instructions.json') as fopen:\n",
    "    translation = json.load(fopen)\n",
    "    \n",
    "for d in translation:\n",
    "    combine.append([\n",
    "        {'role': 'user', 'content': d['input']},\n",
    "        {'role': 'assistant', 'content': d['output']}\n",
    "    ])\n",
    "    \n",
    "len(combine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "95c03d1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "row = combine[-1]\n",
    "prompt = tokenizer.apply_chat_template(row, tokenize=False)\n",
    "outputs = tokenizer(prompt, add_special_tokens = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a4bc7ecc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'<bos><start_of_turn>user\\nterjemah ke bahasa melayu `MRI atau Magnetic Resonance Imaging adalah teknik pencitraan medis yang memanfaatkan magnet kuat dan gelombang radio untuk menghasilkan gambaran detail struktur tubuh internal. Metode ini memiliki kemampuan untuk membuat gambar tiga dimensi dengan detail yang lebih akurat dan lebih tajam dari teknik pencitraan medis lainnya seperti x-ray dan CT Scan.\\n\\nPada dasarnya, MRI menggunakan satuan magnetik bernama tesla untuk membentuk gambaran. Alat MRI berisi magnet superkonduktor yang menghasilkan medan magnet kuat yang melalui tubuh pasien. Keberadaan medan magnet ini akan menyebabkan medan magnetik pada proton-proton di dalam tubuh yang mendukung pembentukan gambar. Ketika pasien berada di dalam ruang magnetik, gelombang radio dengan frekuensi tertentu ditembakkan ke tubuh, melalui sebuah koil, yang kemudian akan merangsang proton-proton tersebut sehingga terbentuk sinyal. Informasi ini kemudian diolah oleh komputer yang menghasilkan gambar tubuh pasien.\\n\\nMRI dapat menghasilkan gambar dengan resolusi lebih tinggi dari teknik pencitraan medis lainnya. Hal ini karena gambar yang dihasilkan sangat detail, dapat menunjukkan detail jaringan otot, tulang, organ, dan cairan dalam tubuh. Selain itu, teknik MRI juga bisa digunakan untuk memperoleh informasi tentang fungsi otak, organ dalam, dan jaringan lunak lainnya.\\n\\nNamun, meskipun teknik MRI sangat berguna dalam diagnosis penyakit, perlu diingat bahwa tidak semua orang dapat menjalani prosedur MRI. Pasien dengan pacemaker, logam di dalam tubuh atau alergi kontras, biasanya tidak diperbolehkan untuk menjalani pemeriksaan MRI.\\n\\nMeskipun demikian, MRI tetap menjadi salah satu teknologi pencitraan medis yang paling berguna dan canggih dalam dunia medis saat ini.`<end_of_turn>\\n<start_of_turn>model\\nMRI atau Pengimejan Resonans Magnetik adalah teknik pengimejan perubatan yang memanfaatkan magnet kuat dan gelombang radio untuk menghasilkan gambaran terperinci struktur badan dalaman. Kaedah ini mempunyai keupayaan untuk membuat imej tiga dimensi dengan perincian yang lebih tepat dan tajam daripada teknik pengimejan perubatan lain seperti x-ray dan CT Scan.\\n\\nPada asasnya, MRI menggunakan unit magnetik bernama tesla untuk membentuk imej. Alat MRI mengandungi magnet superkonduktor yang menghasilkan medan magnet kuat yang melalui tubuh pesakit. Kehadiran medan magnet ini akan menyebabkan medan magnet pada proton di dalam badan yang menyokong pembentukan imej. Apabila pesakit berada di dalam ruang magnet, gelombang radio dengan frekuensi tertentu ditembak ke badan, melalui satu koil, yang kemudiannya akan merangsang proton tersebut sehingga terbentuknya isyarat. Maklumat ini kemudian diproses oleh komputer yang menghasilkan gambar badan pesakit.\\n\\nMRI boleh menghasilkan imej dengan resolusi yang lebih tinggi daripada teknik pengimejan perubatan yang lain. Ini kerana imej yang dihasilkan sangat terperinci, dapat menunjukkan butiran tisu otot, tulang, organ, dan cecair dalam badan. Selain itu, teknik MRI juga boleh digunakan untuk mendapatkan maklumat tentang fungsi otak, organ dalaman, dan tisu lembut yang lain.\\n\\nWalau bagaimanapun, walaupun teknik MRI amat berguna dalam diagnosis penyakit, perlu diingat bahawa tidak semua orang boleh menjalani prosedur MRI. Pesakit dengan pacemaker, logam di dalam badan atau alahan kontras biasanya tidak dibenarkan menjalani pemeriksaan MRI.\\n\\nWalaupun begitu, MRI kekal sebagai salah satu teknologi pengimejan perubatan yang paling berguna dan canggih dalam dunia perubatan hari ini.<end_of_turn>\\n'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "9d0881d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gc\n",
    "\n",
    "def collator(batch, batch_position_ids):\n",
    "    input_ids = []\n",
    "    position_ids = []\n",
    "    masks = []\n",
    "    for i in range(len(batch)):\n",
    "        l = len(batch[i])\n",
    "        input_ids.extend(batch[i])\n",
    "        position_ids.extend(batch_position_ids[i])\n",
    "        masks.append(l)\n",
    "    \n",
    "    return {\n",
    "        'input_ids': np.array(input_ids).astype(np.uint32),\n",
    "        'position_ids': np.array(position_ids).astype(np.uint32),\n",
    "        'attention_mask': np.array(masks).astype(np.uint32),\n",
    "    }\n",
    "\n",
    "def slice_and_balance(nested_list, size):\n",
    "    first = []\n",
    "    balance = []\n",
    "    current_size = 0\n",
    "\n",
    "    for sublist in nested_list:\n",
    "        if current_size < size:\n",
    "            remaining_space = size - current_size\n",
    "            if len(sublist) <= remaining_space:\n",
    "                first.append(sublist)\n",
    "                current_size += len(sublist)\n",
    "            else:\n",
    "                first.append(sublist[:remaining_space])\n",
    "                balance.append(sublist[remaining_space:])\n",
    "                current_size = size\n",
    "        else:\n",
    "            balance.append(sublist)\n",
    "    \n",
    "    return first, balance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "4b8fa435",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "def loop(files, block_size = 8192):\n",
    "    rows, index = files\n",
    "    out_root = f'tokenized-8k/tokenized-{index}'\n",
    "    os.system(f'rm -rf {out_root}')\n",
    "    count = 0\n",
    "    temp = []\n",
    "    position_ids = []\n",
    "    last_block, last_position_block = None, None\n",
    "    with MDSWriter(out=out_root, columns=columns, compression=None, hashes=hashes) as out:\n",
    "        for row in tqdm(rows):\n",
    "            prompt = tokenizer.apply_chat_template(row, tokenize=False)\n",
    "            outputs = tokenizer(prompt, add_special_tokens = False)\n",
    "            temp.append(outputs['input_ids'])\n",
    "            position_ids.append(range(len(outputs['input_ids'])))\n",
    "            count += len(outputs['input_ids'])\n",
    "            while count >= block_size:\n",
    "                block, temp = slice_and_balance(temp, block_size)\n",
    "                block_position, position_ids = slice_and_balance(position_ids, block_size)\n",
    "                count = count - block_size\n",
    "                o = collator(block, block_position)\n",
    "                last_block = block\n",
    "                last_position_block = block_position\n",
    "                out.write(o)\n",
    "                \n",
    "        block, _ = slice_and_balance(last_block, block_size - count)\n",
    "        block_position, _ = slice_and_balance(last_position_block, block_size - count)\n",
    "\n",
    "        block.extend(temp)\n",
    "        block_position.extend(position_ids)\n",
    "\n",
    "        o = collator(block, block_position)\n",
    "        if len(o['input_ids']) == block_size:\n",
    "            out.write(o)\n",
    "            return o"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "bf51c330",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 1418.27it/s]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'input_ids': array([236764,   2868,   5995, ..., 236761,    106,    107], dtype=uint32),\n",
       " 'position_ids': array([102, 103, 104, ..., 287, 288, 289], dtype=uint32),\n",
       " 'attention_mask': array([485, 254,  94, 518, 210, 491, 685, 192, 439, 581, 221, 487, 462,\n",
       "        771, 687, 292, 440, 593, 290], dtype=uint32)}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "loop((combine[:1000], 0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6fabb83f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:47<00:00, 1059.51it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:55<00:00, 896.54it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:12<00:00, 3953.55it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:33<00:00, 1481.41it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:11<00:00, 4168.32it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:44<00:00, 1130.17it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:12<00:00, 3859.54it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:16<00:00, 652.54it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:25<00:00, 584.93it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:32<00:00, 538.12it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:46<00:00, 1071.07it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:36<00:00, 517.35it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:38<00:00, 505.85it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:23<00:00, 2095.44it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:08<00:00, 728.26it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:14<00:00, 671.55it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:09<00:00, 723.61it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:15<00:00, 3170.59it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████| 50000/50000 [02:30<00:00, 333.14it/s]\n",
      " 89%|████████████████████████████████████████████████████████████████████████▋         | 44307/50000 [01:32<00:08, 663.02it/s]IOPub message rate exceeded.\n",
      "The notebook server will temporarily stop sending output\n",
      "to the client in order to avoid crashing it.\n",
      "To change this limit, set the config variable\n",
      "`--NotebookApp.iopub_msg_rate_limit`.\n",
      "\n",
      "Current values:\n",
      "NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n",
      "NotebookApp.rate_limit_window=3.0 (secs)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from multiprocess import Pool\n",
    "\n",
    "def chunks(l, n):\n",
    "    for i in range(0, len(l), n):\n",
    "        yield (l[i: i + n], i // n)\n",
    "\n",
    "chunks = chunks(combine, 50000)\n",
    "pool = Pool(10)\n",
    "pooled = pool.map(loop, chunks)\n",
    "pool.close()\n",
    "pool.join()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "85565e4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['tokenized-8k/tokenized-0',\n",
       " 'tokenized-8k/tokenized-1',\n",
       " 'tokenized-8k/tokenized-2',\n",
       " 'tokenized-8k/tokenized-3',\n",
       " 'tokenized-8k/tokenized-4',\n",
       " 'tokenized-8k/tokenized-5',\n",
       " 'tokenized-8k/tokenized-6',\n",
       " 'tokenized-8k/tokenized-7',\n",
       " 'tokenized-8k/tokenized-8',\n",
       " 'tokenized-8k/tokenized-9',\n",
       " 'tokenized-8k/tokenized-10',\n",
       " 'tokenized-8k/tokenized-11',\n",
       " 'tokenized-8k/tokenized-12',\n",
       " 'tokenized-8k/tokenized-13',\n",
       " 'tokenized-8k/tokenized-14',\n",
       " 'tokenized-8k/tokenized-15',\n",
       " 'tokenized-8k/tokenized-16',\n",
       " 'tokenized-8k/tokenized-17',\n",
       " 'tokenized-8k/tokenized-18',\n",
       " 'tokenized-8k/tokenized-19',\n",
       " 'tokenized-8k/tokenized-20',\n",
       " 'tokenized-8k/tokenized-21',\n",
       " 'tokenized-8k/tokenized-22',\n",
       " 'tokenized-8k/tokenized-23',\n",
       " 'tokenized-8k/tokenized-24',\n",
       " 'tokenized-8k/tokenized-25',\n",
       " 'tokenized-8k/tokenized-26',\n",
       " 'tokenized-8k/tokenized-27']"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "folders = sorted(glob('tokenized-8k/tokenized-*'), key = lambda x: int(x.split('-')[-1]))\n",
    "folders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2e7ae483",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
     ]
    }
   ],
   "source": [
    "!rm -rf packing-8k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "bd3849ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████| 3319/3319 [00:00<00:00, 5083.50it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 3774/3774 [00:00<00:00, 5890.06it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 6353/6353 [00:01<00:00, 4505.00it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 4910/4910 [00:00<00:00, 5772.00it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 5269/5269 [00:01<00:00, 4408.69it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 5006/5006 [00:00<00:00, 5538.79it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 8482/8482 [00:01<00:00, 4782.61it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 5242/5242 [00:01<00:00, 5132.05it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 2221/2221 [00:00<00:00, 5467.68it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1620/1620 [00:00<00:00, 4273.89it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████| 543/543 [00:00<00:00, 24458.82it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████| 515/515 [00:00<00:00, 2912.55it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████| 576/576 [00:00<00:00, 24505.95it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 2735/2735 [00:00<00:00, 4707.58it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 4462/4462 [00:00<00:00, 5601.04it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 3887/3887 [00:00<00:00, 4818.87it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 3926/3926 [00:00<00:00, 4962.36it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 6375/6375 [00:01<00:00, 5264.96it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 6238/6238 [00:01<00:00, 5312.12it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 5203/5203 [00:01<00:00, 5107.21it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1264/1264 [00:00<00:00, 3509.20it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 8401/8401 [00:01<00:00, 5308.09it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 3341/3341 [00:00<00:00, 5691.91it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 4833/4833 [00:00<00:00, 5014.83it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████| 10541/10541 [00:01<00:00, 5317.74it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 3963/3963 [00:00<00:00, 5188.54it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████| 773/773 [00:00<00:00, 4204.61it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████| 790/790 [00:00<00:00, 4304.23it/s]\n"
     ]
    }
   ],
   "source": [
    "with MDSWriter(out='packing-8k', columns=columns, compression=None, hashes=hashes) as out:\n",
    "    for f in folders:\n",
    "        try:\n",
    "            dataset = LocalDataset(local=f)\n",
    "            for i in tqdm(range(len(dataset))):\n",
    "                out.write(dataset[i])\n",
    "        except Exception as e:\n",
    "            print(e)\n",
    "            pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "5a7a76ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.938491904"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset = LocalDataset('packing-8k')\n",
    "(len(dataset) * 8192) / 1e9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "9620c99f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'kan seperti lautan yang gelap\" adalah contoh lain dari bagaimana kata sifat \"lautan\" dapat digunakan untuk menggambarkan sesuatu yang lain.` terjemah ke malay<end_of_turn>\\n<start_of_turn>model\\nTubuh air yang boleh digunakan sebagai kata sifat untuk menggambarkan sesuatu yang lain ialah \"lautan\". Sebagai contoh, istilah \"warna laut\" boleh digunakan untuk menggambarkan warna biru kehijauan yang serupa dengan warna air laut. Ungkapan \"suara ombak\" boleh digunakan untuk menggambarkan bunyi gemuruh perasaan yang serupa dengan bunyi yang dihasilkan oleh gelombang laut. \"Tenang seperti laut\", \"mendalam seperti laut\", dan \"menakutkan seperti lautan gelap\" adalah satu lagi contoh bagaimana kata sifat \"laut\" boleh digunakan untuk menggambarkan sesuatu yang lain.<end_of_turn>\\n<bos><start_of_turn>user\\n`Untuk menghitung dan memplotting spektrum frekuensi gelombang suara dengan menggunakan transformasi Fourier di Python, Anda dapat mengikuti langkah-langkah berikut:\\n\\n1. Mengimpor modul numpy dan memasukkan gelombang suara ke dalam sebuah array numpy:\\n\\n```python\\nimport numpy as np\\n\\nsampling_freq, audio = wavfile.read(\\'ocean_sound.wav\\')\\naudio = np.array(audio, dtype=float)\\n```\\n\\n2. Menghitung panjang sinyal dan memperoleh array waktu yang sesuai dengan durasinya:\\n\\n```python\\nsignal_length = audio.shape[0]\\ntime_array = np.arange(0, signal_length / sampling_freq, 1 / sampling_freq)\\n```\\n\\n3. Menghitung transformasi Fourier dari sinyal dan menerapkan fungsi np.abs() untuk memperoleh amplitudo bagiannya:\\n\\n```python\\nfft = np.fft.fft(audio)\\nmagnitude = np.abs(fft)\\n```\\n\\n4. Menghitung sumbu frekuensi dan mengubahnya dalam bentuk 2-sisi:\\n\\n```python\\nfrequencies = np.linspace(0, sampling_freq, signal_length)\\ntwo_sided_frequency = frequencies[:int(signal_length/2)]\\ntwo_sided_magnitude = magnitude[:int(signal_length/2)]\\n```\\n\\n5. Mengimpor modul matplotlib dan memplotting spektrum frekuensi hasil transformasi Fourier:\\n\\n```python\\nimport matplotlib.pyplot as plt\\n\\nplt.plot(two_sided_frequency, two_sided_magnitude)\\nplt.xlabel(\\'Frequency (Hz)\\')\\nplt.ylabel(\\'Magnitude\\')\\nplt.title(\\'Frequency Spectrum of Ocean Sound\\')\\nplt.show()\\n```\\n\\nDengan mengikuti langkah-langkah tersebut, Anda dapat menghitung dan memplotting spektrum frekuensi gelombang suara yang direkam pada kedalaman 1000 meter dengan frekuensi sampling 44,1 kHz dan durasi 10 detik.` terjemah ke malay<end_of_turn>\\n<start_of_turn>model\\nUntuk mengira dan memplotkan spektrum frekuensi gelombang bunyi menggunakan transformasi Fourier dalam Python, anda boleh mengikuti langkah-langkah berikut:\\n\\n1. Mengimport modul numpy dan memasukkan gelombang bunyi ke dalam array numpy:\\n\\n```python\\nimport numpy as np\\n\\nsampling_freq, audio = wavfile.read(\\'ocean_sound.wav\\')\\naudio = np.array(audio, dtype=float)\\n```\\n\\n2. Kira panjang isyarat dan dapatkan array masa yang sepadan dengan durasinya:\\n\\n```python\\nsignal_length = audio.shape[0]\\ntime_array = np.arange(0, signal_length / sampling_freq, 1 / sampling_freq)\\n```\\n\\n3. Kira transformasi Fourier dari isyarat dan gunakan fungsi np.abs() untuk mendapatkan amplitud bahagiannya:\\n\\n```python\\nfft = np.fft.fft(audio)\\nmagnitude = np.abs(fft)\\n```\\n\\n4. Kira paksi frekuensi dan tukar ia kepada bentuk 2 sisi:\\n\\n```python\\nfrequencies = np.linspace(0, sampling_freq, signal_length)\\ntwo_sided_frequency = frequencies[:int(signal_length/2)]\\ntwo_sided_magnitude = magnitude[:int(signal_length/2)]\\n```\\n\\n5. Mengimport modul matplotlib dan plot spektrum frekuensi hasil daripada transformasi Fourier:\\n\\n```python\\nimport matplotlib.pyplot as plt\\n\\nplt.plot(two_sided_frequency, two_sided_magnitude)\\nplt.xlabel(\\'Frequency (Hz)\\')\\nplt.ylabel(\\'Magnitude\\')\\nplt.title(\\'Spectrum Frekuensi Bunyi Laut\\')\\nplt.show()\\n```\\n\\nDengan mengikuti langkah-langkah ini, anda boleh mengira dan memplot spektrum frekuensi gelombang bunyi yang dirakam pada kedalaman 1000 meter dengan frekuensi pensampelan 44.1 kHz dan tempoh 10 saat.<end_of_turn>\\n<bos><start_of_turn>user\\nterjemah ke bahasa melayu `Dalam urutan ini, angka-angka tersebut adalah hasil dari mengkuadratkan bilangan bulat berturut-turut, yaitu 0^2, 1^2, 2^2, 3^2, 4^2, dst. Oleh karena itu, angka yang hilang harus juga merupakan bilangan bulat yang dihasilkan setelah mengkuadratkan suatu bilangan bulat tertentu. Anda dapat mencoba beberapa angka sebelumnya dengan mengkuadratkan bilangan bulat dan membandingkannya dengan urutan yang diberikan. Dengan mencoba beberapa angka, Anda akan menemukan bahwa angka yang hilang adalah 25, yaitu 5^2.\\n\\nKode MATLAB yang diberikan menggunakan logika ini untuk menghitung angka yang hilang dalam urutan yang diberikan. Kode tersebut memasukkan NaN (Not a Number) sebagai placeholder untuk angka yang hilang dalam urutan. Kemudian, kode berjalan melalui setiap elemen dalam urutan dan mengecek apakah itu NaN. Jika ya, maka kode akan menggunakan rumus untuk menghitung angka persegi berikutnya dalam urutan, dengan menggunakan elemen sebelumnya dalam urutan dan indeks saat ini (yang setara dengan bilangan bulat yang dikembangkan). Rumus tersebut adalah (sequence(i-1) + 2*i - 1). Setelah rumus dihitung, nilai yang dihasilkan ditempatkan pada indeks yang bersesuaian dalam urutan.\\n\\nDalam kasus ini, dari kode yang diberikan, nilai variabel missing_number pada akhirnya akan sama dengan 25, yang menunjukkan bahwa angka yang hilang dalam urutan adalah 25.`<end_of_turn>\\n<start_of_turn>model\\nDalam urutan ini, nombor-nombor tersebut adalah hasil daripada kuadratikkan integer berturut-turut, iaitu 0^2, 1^2, 2^2, 3^2, 4^2, dst. Oleh itu, nombor yang hilang juga mesti merupakan nombor bulat yang dihasilkan selepas kuadratikkan nombor bulat tertentu. Anda boleh mencuba beberapa nombor sebelumnya dengan mengkuadratkan nombor bulat dan membandingkannya dengan jujukan yang diberikan. Dengan mencuba beberapa nombor, anda akan mendapati bahawa nombor yang hilang ialah 25, iaitu 52.\\n\\nKod MATLAB yang diberikan menggunakan logik ini untuk mengira nombor yang hilang dalam jujukan yang diberikan. Kod ini memasukkan NaN (Not a Number) sebagai penanda tempat bagi nombor yang hilang dalam jujukan. Kemudian, kod berjalan melalui setiap elemen dalam jujukan dan menyemak sama ada ia adalah NaN. Jika ya, maka kod akan menggunakan formula untuk mengira nombor segi empat seterusnya dalam jujukan, dengan menggunakan elemen sebelumnya dalam jujukan dan indeks semasa (yang bersamaan dengan nombor bulat yang dibangunkan). Formula adalah (sequence(i-1) + 2*i - 1). Setelah formula dikira, nilai yang terhasil diletakkan pada indeks yang sepadan dalam jujukan.\\n\\nDalam kes ini, dari kod yang diberikan, nilai pembolehubah missing_number akhirnya akan menjadi sama dengan 25, yang menunjukkan bahawa nombor yang hilang dalam jujukan ialah 25.<end_of_turn>\\n<bos><start_of_turn>user\\nteks: Dalam dunia puisi, hubungan antara ular dan sungai bisa digambarkan sebagai tarian yang indah. Seperti penari yang menciptakan gerakan yang sempurna, ular lincah meluncur di atas permukaan sungai yang penuh keindahan. Salah satu metafora yang bisa digunakan adalah:\\n\\n\"Sungai adalah kehidupan yang mengalir, dan ular adalah dancer yang anggun, yang selalu bergerak seiring aliran sungai. Bersama-sama, mereka menciptakan tarian yang indah, mengungkapkan keindahan alam yang tiada tara.\" \\n\\nMetafora ini menggambarkan hubungan simbiosis antara ular dan sungai, di mana keduanya saling terkait dan mempengaruhi satu sama lain untuk menciptakan sebuah karya seni yang indah. Seperti halnya dalam hubungan manusia dan alam, ketika dua entitas yang berbeda ini saling membantu dan mendukung, keindahan dan keharmonisan hidup dapat tercipta di antara mereka.\\nterjemah ke melayu baku<end_of_turn>\\n<start_of_turn>model\\nDalam dunia puisi, hubungan antara ular dan sungai boleh digambarkan sebagai tarian yang indah. Seperti penari yang mencipta gerakan sempurna, ular lincah meluncur di atas permukaan sungai yang penuh dengan keindahan. Salah satu metafora yang boleh digunakan ialah:\\n\\n\"Sungai adalah kehidupan yang mengalir, dan ular adalah penari yang anggun, yang sentiasa bergerak seiring aliran sungai. Bersama-sama, mereka mencipta tarian yang indah, mendedahkan keindahan alam yang tiada tara.\"\\n\\nMetafora ini menggambarkan hubungan simbiosis antara ular dan sungai, di mana kedua-duanya saling berkaitan dan mempengaruhi satu sama lain untuk mencipta karya seni yang indah. Sama seperti dalam hubungan manusia dan alam semula jadi, apabila dua entiti berbeza ini membantu dan menyokong satu sama lain, keindahan dan keharmonian hidup dapat dicipta di kalangan mereka.<end_of_turn>\\n<bos><start_of_turn>user\\nteks: Struktur data yang digunakan dalam ilmu komputer yang memungkinkan untuk pencarian dan penyisipan yang efisien serta penghapusan elemen secara acak adalah struktur data tree atau pohon. Tree adalah struktur data hierarkis dengan satu simpul sebagai akar, dan setiap simpul dengan anak-anak dapat memiliki anak-anak lain yang disebut sub-tree. Dalam tree, setiap elemen disimpan dalam simpul dan setiap simpul dapat memiliki maksimal dua anak. Tree dapat digunakan untuk menyimpan, mengatur, dan mengambil data secara hierarkis. Algoritma yang banyak menggunakan struktur data tree antara lain algoritma pencarian, pengurutan, dan grafik. Tree juga dapat ditemukan dalam database, sistem file, dan aplikasi pengaturan.\\nterjemah ke melayu baku<end_of_turn>\\n<start_of_turn>model\\nStruktur data yang digunakan dalam sains komputer yang membolehkan carian dan penyisipan cekap serta penghapusan elemen secara rawak adalah struktur data pokok atau pokok. Pokok ialah struktur data hierarki dengan satu nod sebagai akar, dan setiap nod dengan anak-anak boleh mempunyai anak lain dipanggil sub-pokok. Dalam pokok, setiap elemen disimpan dalam nod dan setiap nod boleh mempunyai maksimum dua anak. Pokok boleh digunakan untuk menyimpan, menyusun dan mengambil data secara hierarki. Algoritma yang banyak menggunakan struktur data pokok termasuk algoritma carian, penyusunan dan graf. Pokok juga boleh didapati dalam pangkalan data, sistem fail dan aplikasi susunan.<end_of_turn>\\n<bos><start_of_turn>user\\nterjemah ke bahasa melayu `Dalam memprogram robot asisten laboratorium, terdapat beberapa hal yang perlu dipertimbangkan untuk memastikan kemampuan robot dalam menangani situasi darurat dan melindungi keamanan informasi. Beberapa hal yang dapat dilakukan antara lain:\\n\\n1. Identifikasi bahaya potensial: Robot harus dilengkapi dengan sistem sensor yang mampu mengidentifikasi bahaya potensial, seperti suhu, tekanan, atau tumpahan bahan kimia. Sistem sensor ini dapat diprogram untuk memberikan alarm ketika terdeteksi adanya bahaya potensial, seperti suhu yang terlalu tinggi atau terlalu rendah, atau tumpahan bahan kimia yang berbahaya.\\n\\n2. Pelatihan dan pembelajaran: Robot juga harus dilatih dan diberikan pembelajaran untuk bertindak dalam situasi darurat yang berbeda, seperti tumpahan bahan kimia atau kerusakan peralatan. Pelatihan ini dapat dilakukan melalui simulasi atau pengalaman langsung yang terkontrol. Dengan pelatihan yang cukup, robot dapat merespons situasi darurat dengan lebih cepat dan tepat.\\n\\n3. Keamanan informasi: Robot harus dilengkapi dengan sistem keamanan yang dapat mencegah terjadinya pelanggaran atau kebocoran data secara tidak sengaja atau disengaja. Sistem ini dapat meliputi enkripsi data, penggunaan kata sandi, atau bahkan kontrol akses berbasis peran untuk memastikan bahwa hanya pengguna yang berwenang yang dapat mengakses data sensitif.\\n\\n4. Prinsip etika: Perancangan robot harus mengikuti prinsip etika dan standar penelitian yang ditetapkan untuk menjaga integritas penelitian dan teknologi. Robot harus selalu mempertimbangkan efek potensial tindakan mereka pada lingkungan, masyarakat, dan penelitian.\\n\\n5. Monitoring dan audit: Robot harus dilengkapi dengan sistem monitoring dan audit untuk memastikan bahwa mereka selalu berjalan dengan benar. Sistem ini dapat memberikan laporan dan statistik tentang kinerja robot, termasuk kesalahan atau kecacatan yang perlu diperbaiki.\\n\\nDalam memaksimalkan kontribusi robot bagi komunitas ilmiah, dibutuhkan kolaborasi antara robot dan manusia. Robot dapat membantu mempercepat proses penelitian dan meningkatkan akurasi hasil, sementara manusia dapat melakukan pengawasan dan pertanggungjawaban atas tindakan robot. Misalnya, manusia dapat melakukan verifikasi terhadap data yang dihasilkan oleh robot, atau memantau perilaku robot untuk mencegah tindakan yang berpotensi merugikan penelitian atau lingkungan.`<end_of_turn>\\n<start_of_turn>model\\nDalam memprogram robot pembantu makmal, terdapat beberapa perkara yang perlu dipertimbangkan untuk memastikan keupayaan robot dalam menangani situasi kecemasan dan melindungi keselamatan maklumat. Beberapa perkara yang boleh dilakukan termasuk:\\n\\n1. Pengenalpastian bahaya potensial: Robot harus dilengkapi dengan sistem sensor yang mampu mengenal pasti bahaya berpotensi, seperti suhu, tekanan atau tumpahan bahan kimia. Sistem sensor ini boleh diprogramkan untuk memberikan amaran apabila mengesan bahaya potensial, seperti suhu terlalu tinggi atau terlalu rendah, atau tumpahan bahan kimia berbahaya.\\n\\n2. Latihan dan pembelajaran: Robot juga harus dilatih dan diberikan pembelajaran untuk bertindak dalam keadaan darurat yang berbeza, seperti tumpahan bahan kimia atau kerosakan peralatan. Latihan ini boleh dilakukan melalui simulasi atau pengalaman langsung yang terkawal. Dengan latihan yang mencukupi, robot dapat bertindak balas kepada situasi kecemasan dengan lebih cepat dan tepat.\\n\\n3. Keselamatan maklumat: Robot harus dilengkapi dengan sistem keselamatan yang boleh menghalang pelanggaran atau kebocoran data secara tidak sengaja atau disengajakan. Sistem ini boleh merangkumi penyulitan data, penggunaan kata laluan, atau kawalan akses berasaskan peranan untuk memastikan hanya pengguna berkuasa yang boleh mengakses data sensitif.\\n\\n4. Prinsip etika: Reka bentuk robotik harus mematuhi prinsip etika dan piawaian penyelidikan yang ditetapkan untuk mengekalkan integriti penyelidikan dan teknologi. Robot mesti sentiasa mempertimbangkan kesan tindakan mereka yang berpotensi terhadap alam sekitar, masyarakat dan penyelidikan.\\n\\n5. Pemantauan dan audit: Robot harus dilengkapi dengan sistem pemantauan dan audit untuk memastikan ia sentiasa berjalan dengan betul. Sistem ini boleh menyediakan laporan dan statistik tentang prestasi robot, termasuk kesilapan atau kecacatan yang perlu diperbaiki.\\n\\nDalam memaksimumkan sumbangan robot kepada komuniti saintifik, kerjasama diperlukan antara robot dan manusia. Robot boleh membantu mempercepatkan proses penyelidikan dan meningkatkan ketepatan keputusan, manakala manusia boleh melakukan pengawasan dan tanggungjawab ke atas tindakan robot. Sebagai contoh, manusia boleh melakukan pengesahan data yang dihasilkan oleh robot, atau memantau tingkah laku robot untuk mencegah tindakan yang berpotensi menjejaskan penyelidikan atau persekitaran.<end_of_turn>\\n<bos><start_of_turn>user\\nterjemah ke bahasa melayu `Tentu saja, saya senang dapat membantu! Berikut dua rekomendasi hidangan penutup yang mudah dibuat dan menyenangkan untuk dicicipi:\\n\\n1. Puding Mangga\\n<img src=\"https://www.dapurumami.com/wp-content/uploads/2015/08/Resep-puding-mangga-sp-750x393.jpg\" alt=\"Puding Mangga\">\\n\\nBahan-bahan:\\n- 500 ml susu cair\\n- 2 sachet agar-agar bubuk\\n- 5 sendok makan gula pasir\\n- 2 buah mangga, kupas dan potong dadu kecil\\n- Air secukupnya\\n- Selai mangga secukupnya\\n- Whipped cream secukupnya\\n\\nCara membuat:\\n1. Campurkan susu cair, agar-agar bubuk, dan gula pasir dalam panci.\\n2. Masak campuran tersebut dengan api sedang dan aduk terus hingga mendidih.\\n3. Setelah itu, matikan api dan biarkan campuran dingin sebentar.\\n4. Campurkan potongan mangga ke dalam campuran agar-agar sambil terus diaduk.\\n5. Tuang campuran puding ke dalam wadah dan biarkan dingin hingga puding mengeras.\\n6. Jika sudah mengeras, tambahkan selai mangga dan whipped cream di atasnya sebagai hiasan.\\n7. Sajikan puding mangga dalam porsi kecil dan hidangkan pada tamu.\\n\\n2. Es Krim Vanilla dengan Saus Coklat\\n<img src=\"https://www.masakapahariini.com/wp-content/uploads/2018/05/Resep-Es-krim-vanila.png\" alt=\"Es Krim Vanilla dengan Saus Coklat\">\\n\\nBahan-bahan:\\n- 1 liter es krim vanilla\\n- 200 gram coklat batang, cincang kasar\\n- 250 ml susu cair\\n- 2 sendok makan gula pasir\\n\\nCara membuat:\\n1. Panaskan susu cair dan gula pasir dalam panci dengan api sedang.\\n2. Masukan coklat cincang ke dalam campuran susu sedikit-sedikit sambil terus diaduk hingga coklat meleleh.\\n4. Setelah itu, angkat panci dan dinginkan selama beberapa menit.\\n5. Sajiikan es krim vanilla di atas mangkok dan beri saus coklat di atasnya.\\n6. Es krim dan saus coklat sudah siap dihidangkan. Nikmati kreasimu.\\n\\nSelamat mencoba dan semoga berhasil!`<end_of_turn>\\n<start_of_turn>model\\nSudah tentu, saya gembira dapat membantu! Berikut adalah dua cadangan hidangan penutup yang mudah dibuat dan sedap untuk dicicipi:\\n\\n1. Puding Mangga\\n<img src=\"https://www.dapurumami.com/wp-content/uploads/2015/08/Resep-puding-mangga-sp-750x393.jpg\" alt=\"Puding Mangga\">\\n\\nBahan-bahan:\\n- 500 ml susu cair\\n- 2 sachet serbuk koko\\n- 5 sudu makan gula pasir\\n- 2 buah mangga, kupas dan potong dadu kecil\\n- Air secukupnya\\n- Telur mangga secukupnya\\n- Krim whipped secukupnya\\n\\nCara membuat:\\n1. Campurkan susu cair, serbuk koko, dan gula pasir ke dalam periuk.\\n2. Masak campuran dengan api sederhana dan kacau rata hingga mendidih.\\n3. Selepas itu, matikan api dan biarkan adunan sejuk seketika.\\n4. Campurkan kepingan mangga ke dalam adunan sambil terus dikacau.\\n5. Tuangkan adunan puding ke dalam bekas dan biarkan ia sejuk sehingga puding mengeras.\\n6. Jika sudah mengeras, tambahkan telor mangga dan krim whipped di atasnya sebagai hiasan.\\n7. Hidangkan puding mangga dalam bungkusan kecil dan hidangkan kepada tetamu.\\n\\n2. Es Krim Vanilla dengan Sos Coklat\\n<img src=\"https://www.masakapahariini.com/wp-content/uploads/2018/05/Resep-Es-krim-vanilla.png\" alt=\"Es Krim Vanilla dengan Sos Coklat\">\\n\\nBahan-bahan:\\n- 1 liter es krim vanilla\\n- 200 gram batang coklat, cincang kasar\\n- 250 ml susu cair\\n- 2 sudu makan gula pasir\\n\\nCara membuat:\\n1. Panaskan susu cecair dan gula pasir ke dalam periuk dengan api sederhana.\\n2. Masukkan sedikit chopped chocolate ke dalam adunan susu sambil terus dikacau hingga sebati.\\n4. Selepas itu, angkat periuk dan sejukkan selama beberapa minit.\\n5. Taburkan ais krim vanilla di atas mangkuk dan taburkan sos coklat di atasnya.\\n6. Ais krim dan sos coklat sedia dihidang. Nikmati kreativiti anda.\\n\\nSelamat mencuba dan semoga berjaya!<end_of_turn>\\n<bos><start_of_turn>user\\nterjemah ke bahasa melayu `Untuk menggunakan kode JavaScript di atas dan membuat daftar lima sinonim kata \"bahagia\", Anda bisa mengikuti langkah-langkah berikut:\\n\\n1. Salin kode JavaScript di atas dan pastikan Anda memiliki akses internet.\\n\\n2. Buka editor kode JavaScript, seperti Visual Studio Code atau Notepad++, kemudian tempelkan kode tersebut.\\n\\n3. Ganti kata \"bahagia\" pada baris kedua dengan kata yang ingin Anda cari sinonimnya. Contohnya, kata \"senang\". Jika ingin mencari sinonim dari kata yang terdiri dari lebih dari satu kata, gunakan tanda \"+\" sebagai pengganti spasi. Contohnya, jika ingin mencari sinonim dari kata \"rumah sakit\", ganti kata \"bahagia\" dengan \"rumah+sakit\".\\n\\n4. Simpan kode tersebut dengan nama file yang diakhiri dengan ekstensi .js, seperti sinonim.js.\\n\\n5. Buka terminal atau command prompt pada komputer Anda, kemudian arahkan ke direktori tempat file JavaScript tersebut disimpan.\\n\\n6. Jalankan perintah \"node sinonim.js\" pada terminal. Program akan melakukan permintaan ke API Datamuse dan mencetak daftar lima sinonim ke konsol.\\n\\n7. Selesai. Anda sekarang dapat menggunakan kode JavaScript untuk mencari daftar lima sinonim dari kata yang diinginkan menggunakan API Datamuse.`<end_of_turn>\\n<start_of_turn>model\\nUntuk menggunakan kod JavaScript di atas dan membuat senarai lima sinonim perkataan \"bahagia\", anda boleh mengikuti langkah-langkah berikut:\\n\\n1. Salin kod JavaScript di atas dan pastikan anda mempunyai akses internet.\\n\\n2. Buka penyunting kod JavaScript, seperti Visual Studio Code atau Notepad++, kemudian tampal kod tersebut.\\n\\n3. Gantikan perkataan \"bahagia\" pada baris kedua dengan perkataan yang ingin anda carikan sinonimnya. Contohnya, perkataan \"senang\". Jika anda ingin mencari sinonim bagi perkataan yang terdiri daripada lebih dari satu perkataan, gunakan tanda \"+\" sebagai ganti ruang. Sebagai contoh, jika anda ingin mencari sinonim bagi perkataan \"rumah sakit\", gantikan perkataan \"bahagia\" dengan \"rumah+sakit\".\\n\\n4. Simpan kod dengan nama fail yang berakhir dengan sambungan.js, seperti sinonim.js.\\n\\n5. Buka terminal atau command prompt pada komputer anda, kemudian arahkan ke direktori tempat fail JavaScript disimpan.\\n\\n6. Jalankan perintah \"node sinonim.js\" pada terminal. Program akan melakukan permintaan kepada API Datamuse dan mencetak daftar lima sinonim ke konsol.\\n\\n7. Selesai. Anda kini boleh menggunakan kod JavaScript untuk mencari daftar lima sinonim bagi perkataan yang dikehendaki menggunakan API Datamuse.<end_of_turn>\\n<bos><start_of_turn>user\\nterjemah ke bahasa melayu `Restorannya memiliki suasana yang elegan dan terasa hangat dengan penerangan yang lembut. Dekorasinya terinspirasi oleh gaya Perancis dengan meja-meja kayu yang indah, kursi kulit yang nyaman, lampu gantung yang cantik, dan aksen bunga-flores yang menawan. Suasana restoran bistro juga terdengar selaras dengan musik klasik dengan nada lembut yang meningkatkan suasana yang tenang dan santai. Para tamu bisa merasakan kehangatan di meja mereka sambil menikmati hidangan bistro Perancis yang lezat dan menawan. Meskipun menjadi tempat yang cocok untuk makan malam romantis, restoran ini tetap terlihat santai dan ramah untuk berbagai acara, baik perayaan keluarga maupun pertemuan bisnis. Produk yang ditawarkan sangat terjamin, dari mulai hidangan pembuka, hidangan utama, hingga dessert. Semua dipenuhi dengan cita rasa yang sangat kaya, disiapkan dengan hati-hati oleh tim memasak berbakat yang menggunakan bahan-bahan terbaik dari pasar lokal. Semua elemen di restoran ini dirancang dengan keindahan, keharmonisan, dan keramahan, menjamin para tamu dapat menikmati pengalaman kuliner dan merasa puas.`<end_of_turn>\\n<start_of_turn>model\\nRestorannya mempunyai suasana yang elegan dan terasa hangat dengan penerangan yang lembut. Hiasannya diilhamkan oleh gaya Perancis dengan meja kayu yang cantik, kerusi kulit selesa, lampu gantung yang cantik dan loghat bunga-flores yang menawan. Suasana restoran bistro juga kedengaran selaras dengan muzik klasik dengan nada lembut yang meningkatkan suasana yang tenang dan santai. Para tetamu dapat merasai kehangatan pada meja mereka sambil menikmati hidangan bistro Perancis yang lazat dan menawan. Walaupun ia adalah tempat yang sesuai untuk makan malam romantis, restoran ini tetap kelihatan santai dan mesra untuk pelbagai acara, sama ada perayaan keluarga mahupun pertemuan perniagaan. Produk yang ditawarkan sangat terjamin, dari hidangan pembuka selera, hidangan utama hingga pencuci mulut. Semuanya dipenuhi dengan cita rasa yang sangat kaya, disediakan dengan teliti oleh pasukan memasak berbakat yang menggunakan bahan terbaik daripada pasaran tempatan. Semua elemen dalam restoran ini direka bentuk dengan keindahan, keharmonian dan keramahan, memastikan para tetamu dapat menikmati pengalaman masakan dan merasa puas hati.<end_of_turn>\\n<bos><start_of_turn>user\\nteks: Laba-laba dan semut adalah dua hewan yang sangat berbeda dalam hal fisiologi, perilaku, dan peran ekologis mereka di ekosistem. \\n\\nSistem Saraf: Laba-laba memiliki sistem saraf otonom yang kompleks, yang membantu mereka mengendalikan penangkapan mangsa dan gerakan tubuh mereka. Sementara itu, sistem saraf semut juga kompleks dalam mengendalikan gerakan mereka, tetapi juga memiliki kemampuan untuk berkomunikasi dengan anggota semut lainnya melalui sinyal kimia.\\n\\nSistem Pencernaan: Laba-laba memiliki sistem pencernaan yang unik, yang membantu mereka mencerna dan menghancurkan protein yang diambil dari mangsanya. Sementara itu, semut memiliki tiga bagian lambung yang memungkinkan mereka mencerna makanan secara efektif dan menyimpan cadangan makanan dalam tubuh mereka.\\n\\nPerilaku: Perilaku sosial laba-laba dan semut sangat berbeda. Laba-laba cenderung soliter dan hanya berkumpul dengan pasangan selama musim kawin. Sementara itu, semut adalah hewan yang sangat sosial dan bekerja dalam koloni yang kompleks, dengan tugas yang dibagi di antara pekerja, prajurit, dan ratu.\\n\\nDampak pada peran ekologis: Laba-laba dan semut memiliki peran ekologis yang sangat berbeda di ekosistem mereka masing-masing. Laba-laba membantu mengendalikan populasi serangga lain di ekosistem, sementara semut membantu dalam proses dekomposisi material organik dan pembuangan sampah dari lingkungan mereka. \\n\\nDalam rangka mempertahankan keberlanjutan di ekosistem, penting untuk memahami perbedaan fisiologis dan perilaku antara hewan-hewan seperti laba-laba dan semut. Hal ini dapat membantu kita dalam mengembangkan strategi yang tepat dalam mengelola populasi mereka di lingkungan tempat mereka hidup.\\nterjemah ke melayu baku<end_of_turn>\\n<start_of_turn>model\\nLaba-laba dan semut adalah dua haiwan yang sangat berbeza dari segi fisiologi, tingkah laku, dan peranan ekologi mereka dalam ekosistem.\\n\\nSistem Nervous: Laba-laba mempunyai sistem saraf autonomi yang kompleks, yang membantu mereka mengawal penangkapan mangsa dan pergerakan badan mereka. Sementara itu, sistem saraf semut juga kompleks dalam mengendalikan gerakan mereka, tetapi ia juga mempunyai keupayaan untuk berkomunikasi dengan anggota semut lain melalui isyarat kimia.\\n\\nSistem Penghadaman: Laba-laba mempunyai sistem pencernaan yang unik, yang membantu mereka mencerna dan memusnahkan protein yang diambil daripada mangsanya. Sementara itu, semut mempunyai tiga bahagian perut yang membolehkan mereka mencerna makanan secara berkesan dan menyimpan rizab makanan di dalam tubuh mereka.\\n\\nTingkah Laku: Perilaku sosial labah-labah dan semut sangat berbeza. Laba-labah cenderung menjadi soliter dan hanya berkumpul bersama pasangan semasa musim mengawan. Sementara itu, semut adalah haiwan yang sangat sosial dan bekerja dalam koloni yang kompleks, dengan tugas dibahagikan antara pekerja, askar, dan ratu.\\n\\nKesan kepada peranan ekologi: Laba-labah dan semut mempunyai peranan ekologi yang sangat berbeza dalam ekosistem masing-masing. Laba-labah membantu mengawal populasi serangga lain dalam ekosistem, manakala semut membantu dalam proses penguraian bahan organik dan pembuangan sampah dari persekitaran mereka.\\n\\nDalam rangka mempertahankan kelestarian dalam ekosistem, penting untuk memahami perbezaan fisiologi dan tingkah laku antara haiwan seperti labah-labah dan semut. Ini boleh membantu kita membangunkan strategi yang betul dalam menguruskan populasi mereka dalam persekitaran tempat tinggal mereka.<end_of_turn>\\n<bos><start_of_turn>user\\nteks: 1. Bagaimana topografi dasar laut mempengaruhi keanekaragaman hayati di wilayah R yang memiliki ekosistem laut?\\n2. Apa jenis batu yang membentuk dasar laut wilayah R dan bagaimana formasi geologi ini mempengaruhi kelautan di daerah ini?\\n3. Bagaimana polusi dan perubahan iklim berdampak pada ekosistem laut di sekitar wilayah R?\\n4. Apa spesies ikan yang paling sering terjaring di perairan wilayah R dan apakah keberadaan spesies ini masih stabil?\\n5. Bagaimana perubahan manusia, seperti pembangunan pantai dan perikanan berlebihan, mempengaruhi fungsi dan keseimbangan ekosistem laut di wilayah R?\\nterjemah ke melayu baku<end_of_turn>\\n<start_of_turn>model\\n1. Bagaimanakah topografi dasar laut mempengaruhi kepelbagaian biologi di rantau R yang mempunyai ekosistem marin?\\n2. Apakah jenis batu yang membentuk dasar laut rantau R dan bagaimana pembentukan geologi ini menjejaskan kehidupan marin di kawasan ini?\\n3. Bagaimanakah pencemaran dan perubahan iklim memberi kesan kepada ekosistem marin di sekitar rantau R?\\n4. Apakah spesies ikan yang paling kerap ditemui di perairan wilayah R dan adakah kewujudan spesies ini masih stabil?\\n5. Bagaimanakah perubahan manusia, seperti pembangunan pantai dan perikanan berlebihan, menjejaskan fungsi dan keseimbangan ekosistem marin di rantau R?<end_of_turn>\\n<bos><start_of_turn>user\\nterjemah ke bahasa melayu `Untuk membuat pembangkit pesan dinamis yang bisa menyesuaikan pesan untuk setiap pengguna berdasarkan aktivitas online terbaru mereka, pertama-tama kita harus mengumpulkan data tentang aktivitas online pengguna dan perilaku mereka. Kemudian, kita dapat menggunakan algoritma untuk menganalisis data ini dan menghasilkan pesan personal yang cocok untuk setiap pengguna.\\n\\nBerikut adalah beberapa langkah untuk membuat pembangkit pesan dinamis ala Ruby:\\n\\n1. Mengumpulkan data\\nUntuk mengumpulkan data, kita dapat menggunakan sistem pelacakan seperti Google Analytics atau Mixpanel untuk melacak perilaku pengguna di situs web atau aplikasi kita. Data ini dapat mencakup informasi tentang halaman yang mereka lihat, produk yang telah mereka lihat atau dibeli, provinsi atau kota dalam lokasi mereka, dan banyak lagi.\\n\\n2. Menafsirkan data\\nSetelah kita mengumpulkan data, langkah selanjutnya adalah menafsirkannya agar bisa berguna untuk membuat pesan. Untuk menafsirkan data, kita dapat menggunakan berbagai teknik, termasuk analisis data, pemrosesan bahasa alami, atau kecerdasan buatan. \\n\\n3. Menampilkan pesan\\nSetelah menafsirkan data dan membuat pesan, sekarang kita perlu menampilkan pesan ke pengguna secara tepat. Caranya adalah dengan memasukkan pesan ke dalam halaman web atau aplikasi kita, mungkin menjadi kotak pop-up atau persegi panjang muncul di bagian bawah halaman.\\n\\nSetelah kita menjalankan algoritma dengan menggunakan data dan model yang berhasil kita bangun, inilah contoh kode Ruby bagaimana cara menampilkan pesan untuk user:\\n\\n```\\nuser_data = {\\n  \"name\" => \"John\",\\n  \"location\" => \"Jakarta\",\\n  \"interest\" => \"Travel\",\\n  \"recently_viewed\" => \"Beach destinations\",\\n}\\n\\n# Define the message that will be dynamically generated\\nmessage = \"Hello #{user_data[\\'name\\']}! We noticed that you recently viewed information about #{user_data[\\'recently_viewed\\']}. Based on your location in #{user_data[\\'location\\']}, you might be interested in visiting some of our other beach destinations. Check them out now!\"\\n\\n# Display the message to the user\\nputs message\\n```\\n\\nDalam kode ini, kita menggunakan data pengguna yang telah dikumpulkan, seperti nama pengguna, lokasi, dan minat nya, dan juga melihat artikel atau produk terakhir yang telah dilihat oleh pengguna. Berdasarkan data ini, kita dapat membuat pesan dinamis yang mencakup sapaan personal dan merujuk ke artikel atau produk tertentu yang digunakan oleh pengguna.`<end_of_turn>\\n<start_of_turn>model\\nUntuk membuat pembangkit mesej dinamik yang boleh menyesuaikan pesanan untuk setiap pengguna berdasarkan aktiviti dalam talian terkini mereka, pertama sekali kita perlu mengumpulkan data tentang aktiviti dalam talian pengguna dan tingkah laku mereka. Kemudian, kita boleh menggunakan algoritma untuk menganalisis data ini dan menghasilkan mesej peribadi yang sesuai untuk setiap pengguna.\\n\\nBerikut adalah beberapa langkah untuk membuat pembangkit mesej dinamik ala Ruby:\\n\\n1. Mengumpul data\\nUntuk mengumpul data, kita boleh menggunakan sistem pengelogan seperti Google Analytics atau Mixpanel untuk mengesan tingkah laku pengguna di laman web atau aplikasi kita. Data ini boleh merangkumi maklumat halaman yang mereka lihat, produk yang telah mereka lihat atau beli, wilayah atau bandar dalam lokasi mereka, dan banyak lagi.\\n\\n2. Mentafsir data\\nSetelah kita mengumpulkan data, langkah seterusnya ialah mentafsirkannya supaya ia berguna untuk membuat pesanan. Untuk menafsirkan data, kita boleh menggunakan pelbagai teknik, termasuk analisis data, pemprosesan bahasa semula jadi, atau kecerdasan buatan.\\n\\n3. Menampilkan mesej\\nSelepas mentafsir data dan membuat pesanan, sekarang kita perlu memaparkan mesej kepada pengguna secara tepat. Caranya adalah dengan memasukkan mesej ke dalam halaman web atau aplikasi kita, mungkin menjadi kotak pop-up atau segi empat sama muncul di bahagian bawah halaman.\\n\\nSetelah kita menjalankan algoritma dengan menggunakan data dan model yang berjaya kita bina, berikut adalah contoh kod Ruby bagaimana untuk memaparkan mesej untuk pengguna:\\n\\n```\\nuser_data = {\\n  \"name\" => \"John\",\\n  \"location\" => \"Jakarta\",\\n  \"interest\" => \"Travel\",\\n  \"recently_viewed\" => \"Beach destinations\",\\n}\\n\\n# Takrifkan mesej yang akan dijana secara dinamik\\nmessage = \"Hello #{user_data[\\'name\\']}! We noticed that you recently viewed information about #{user_data[\\'recently_viewed\\']}. Based on your location in #{user_data[\\'location\\']}, you might be interested in visiting some of our other beach destinations. Check them out now!\"\\n\\n# Paparkan mesej kepada pengguna\\nputs message\\n```\\n\\nDalam kod ini, kita menggunakan data pengguna yang telah dikumpulkan, seperti nama pengguna, lokasi, dan minat mereka, dan juga melihat artikel atau produk terakhir yang telah dilihat oleh pengguna. Berdasarkan data ini, kita dapat membuat pesanan dinamik yang meliputi sapaan peribadi dan merujuk kepada artikel atau produk tertentu yang digunakan oleh pengguna.<end_of_turn>\\n<bos><start_of_turn>user\\nteks: Keseimbangan antara pekerjaan dan kehidupan mengacu pada kemampuan seseorang untuk menjaga keseimbangan yang sehat antara tuntutan kerja dan kehidupan pribadi mereka. Ini mencakup waktu yang dihabiskan untuk pekerjaan, kesehatan fisik dan mental, hubungan sosial, dan waktu untuk mengejar minat dan hobi pribadi. \\n\\nUntuk dapat mencapai keseimbangan yang baik antara pekerjaan dan kehidupan, penting untuk menetapkan prioritas dan membangun rutinitas yang sehat. Berikut adalah beberapa tips yang dapat membantu:\\n\\n1. Tetapkan batasan waktu kerja: Tetapkan jam kerja yang tepat dan usahakan untuk menepatinya. Jangan membawa pekerjaan ke rumah atau memeriksa email kerja di waktu-waktu yang seharusnya untuk bersantai.\\n\\n2. Buat jadwal rutin: Buat jadwal rutin yang mencakup waktu untuk pekerjaan, istirahat, aktivitas fisik, dan kegiatan sosial. Tetapkan waktu untuk memasak, belanja, dan rutinitas rumah lainnya agar tidak terbebani selama hari kerja.\\n\\n3. Prioritaskan kesehatan fisik: Selalu usahakan mengatur jadwal rutin untuk olahraga dan waktu istirahat agar tidak terlalu capek karena pekerjaan. Ini akan membantu menjaga kesehatan fisik dan juga memberi waktu untuk merenung dan merilekskan diri.\\n\\n4. Gunakan alat bantu: Menggunakan alat bantu seperti aplikasi produktivitas dan manajemen waktu dapat membantu untuk mengelola pekerjaan dan memastikan waktu yang cukup tersedia untuk kegiatan lainnya.\\n\\n5. Berbicara dengan atasan dan kolega: Selalu ingat bahwa itu adalah hak setiap karyawan untuk memiliki keseimbangan yang sehat antara pekerjaan dan kehidupan pribadi. Jangan ragu untuk berbicara dengan atasan dan rekan kerja untuk mengatur jadwal yang memungkinkan Anda memprioritaskan kehidupan pribadi Anda. \\n\\nDengan menetapkan prioritas, membangun rutinitas rutin, dan berbicara dengan atasan dan kolega, seseorang dapat mencapai keseimbangan yang baik antara pekerjaan dan kehidupan pribadi mereka. Ini dapat membantu meningkatkan kesejahteraan secara keseluruhan, memberi seseorang waktu dan ruang untuk mengejar minat dan hobi yang lebih kreatif, dan meningkatkan produktivitas di tempat kerja.\\nterjemah ke melayu baku<end_of_turn>\\n<start_of_turn>model\\nKeseimbangan antara kerja dan kehidupan merujuk kepada keupayaan seseorang untuk mengekalkan keseimbangan yang sihat antara tuntutan kerja dan kehidupan peribadi mereka. Ini termasuk masa yang dihabiskan untuk bekerja, kesihatan fizikal dan mental, hubungan sosial, dan masa untuk mengejar minat dan hobi peribadi.\\n\\nUntuk mencapai keseimbangan yang baik antara pekerjaan dan kehidupan, adalah penting untuk menetapkan keutamaan dan membina rutin yang sihat. Berikut ialah beberapa petua yang boleh membantu:\\n\\n1. Tetapkan had waktu bekerja: Tetapkan jam kerja yang betul dan cuba untuk menepatinya. Jangan membawa kerja ke rumah atau menyemak e-mel kerja pada waktu yang sepatutnya untuk berehat.\\n\\n2. Buat jadual rutin: Buat jadual rutin yang merangkumi masa untuk bekerja, rehat, aktiviti fizikal dan aktiviti sosial. Tetapkan masa untuk memasak, membeli-belah dan rutin lain di rumah supaya anda tidak terbeban semasa hari kerja.\\n\\n3. Utamakan kesihatan fizikal: Sentiasa berusaha untuk mengatur jadual rutin untuk bersenam dan waktu rehat agar anda tidak terlalu letih kerana kerja. Ini akan membantu menjaga kesihatan fizikal dan juga memberi masa untuk merenung dan melegakan diri.\\n\\n4. Gunakan'"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode(dataset[-3]['input_ids'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "42c4a0c3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
